今天來介紹彈出視窗。
彈出視窗是一種很常見的軟體通知形式,拿來明確、直接的告知使用者「這裡有事情需要注意喔!」像這樣:
挺嚇人的吧,但是彈出視窗不失為一個很有效的通知方式。我們今天就來看看 Qt 怎麼實現彈出視窗吧。
Qt 的彈出通知視窗叫做 QMessageBox
以下是一個最簡單的用法:
QMessageBox msgBox;
msgBox.setText("檔案損毀,無法開啟!");
msgBox.exec();
我們先建構一個QMessageBox物件,用setText()設定顯示文字,然後呼叫exec(),這樣就會彈出一個通知視窗了。彈出視窗會站在主視窗前方,而且在關掉通知視窗之前,你沒辦法操作主視窗。
要注意 msgBox.exec();
是一個 blocking (阻塞式) 函數,也就是說,在彈出視窗關閉之前,程式都不會往下跑,會停在這一行。直到使用者關閉彈出視窗之後,下面的程式碼才會繼續執行。
QMessageBox 還有更進階的用法,除了指定顯示文字以外,還有要顯示哪些按鈕:
QMessageBox msgBox;
msgBox.setText("檔案已經被修改!");
msgBox.setInformativeText("要儲存檔案嗎?");
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
最後可以根據 msgBox.exec();
的回傳值,得知使用者按了哪個按鈕。
switch (ret) {
case QMessageBox::Save:
break;
case QMessageBox::Discard:
break;
case QMessageBox::Cancel:
break;
}
請打開昨天的專案,在今天之前,我們並沒有處理檔案格式不支援的問題。
現在的目標是:當檔案無法開啟時,要彈出警告視窗並告訴使用者「不支援的檔案格式」!
打開 mainwindow.cpp 並且修改 loadImage() 成員函數。當 QImageReader 讀取失敗時,我們用上面的技巧,設定彈出視窗並給予提示文字。除此之外,還用了 msgBox.setIcon() 方法,顯示一個黃色的「警告」的圖示
void MainWindow::loadImage(const QString& fileName)
{
QImageReader reader(fileName);
reader.setAutoTransform(true);
const QImage newImage = reader.read();
if (newImage.isNull())
{
QMessageBox msgBox;
msgBox.setText("不支援的檔案格式!");
msgBox.setInformativeText("請打開PNG或JPG");
msgBox.setIcon(QMessageBox::Warning);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
return;
}
...
這樣我們就完成彈出視窗囉!